JSON の整形・検索・CSV 変換ができる jq コマンド応用編

便利ワザ

jq コマンド応用編として、整形・検索・CSV 変換の手順を解説します。
それぞれ jq コマンド単体で完了するため便利に使えます。

jq コマンドのインストールや基本操作については、下記の記事を参照ください。

jq コマンドの使い方 基本編
jq コマンドのインストール手順 (CentOS)



JSON サンプルデータ

今回は、以下の JSON をサンプルデータとして使用します。

{"users":[{"id":1001,"name":"yamada","age":30},{"id":1002,"name":"tanaka","age":25},{"id":1003,"name":"kimura","age":20}]}

整形すると以下の通りです。3人のユーザデータが含まれています。

$ cat json | jq .
{
  "users": [
    {
      "id": 1001,
      "name": "yamada",
      "age": 30
    },
    {
      "id": 1002,
      "name": "tanaka",
      "age": 25
    },
    {
      "id": 1003,
      "name": "kimura",
      "age": 20
    }
  ]
}

JSON の値で絞り込む select 関数

文字列検索

JSON に含まれる値を使って絞り込みが可能です。
.users[] の中から、名前が tanaka の項目のみを抽出します。

$ cat json | jq '.users[] | select(.name == "tanaka")'
{
  "age": 25,
  "name": "tanaka",
  "id": 1002
}

.users[] の後に select(.name =="tanaka") を入れるのがポイントです。
select(.users.[].name == "tanaka") と一度に指定すると上手く動きません。

数値比較

30歳未満のユーザを抽出する場合は、以下のコマンドとなります。

$ cat json | jq '.users[] | select(.age < 30)'
{
  "age": 25,
  "name": "tanaka",
  "id": 1002
}
{
  "age": 20,
  "name": "kimura",
  "id": 1003
}

jq コマンドで JSON の値を変更・整形する

JSON に含まれるデータの加減算や、値の上書きといった変更も jq で行えます。

数値演算

全員の年齢に +1 した上で表示させます。

$ cat json | jq '.users[].age + 1'
31
26
21

文字列上書き

指定したキーの中身(値)を書き換えることができます。
名前が kimura となっているデータを suzuki に置き換える例です。

$ cat json | jq '.users[] | select(.name == "kimura") | .name = "suzuki"'
{
  "age": 20,
  "name": "suzuki",
  "id": 1003
}

jq コマンドで JSON を CSV に変換する

jq コマンドは、JSON を CSV に変換する機能も備えています。
まずは、1行に値が横並びとなるように加工します。

$ cat json | jq '.users[] | [.id,.name,.age]'
[
  1001,
  "yamada",
  30
]
[
  1002,
  "tanaka",
  25
]
[
  1003,
  "kimura",
  20
]

不要な改行を除去するために、-c オプションを追加します。

$ cat json | jq -c '.users[] | [.id,.name,.age]'
[1001,"yamada",30]
[1002,"tanaka",25]
[1003,"kimura",20]

この状態で @csv に値を渡すと、CSV として出力されます。

$ cat json | jq -r -c '.users[] | [.id,.name,.age] | @csv'
1001,"yamada",30
1002,"tanaka",25
1003,"kimura",20

まとめ

jq コマンドの応用編として、絞り込みや CSV 出力の方法を解説しました。
簡単な JSON の加工であれば jq 単体でも対応可能です。

REST API の普及に伴い、JSON を利用する場面も増えてきました。
機会があれば、ぜひ jq コマンドでの整形・加工をお試しください。

【関連記事】
jq コマンドの使い方 基本編
jq コマンドのインストール手順 (CentOS)
MongoDB のインストール手順 (CentOS)
開けないファイルの調査コマンドを解説
MySQL クエリの整形・CSV 出力方法